package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5推出时推出了一个新特性:增强型for循环
 * 也称为新循环,可以用相同的语法遍历集合或数组.
 * 注意:新循环仅用来遍历集合或数组,不取代传统循环的工作.
 * 语法:
 * for(元素类型 变量名 : 集合或数组){
 *     ...
 * }
 */
public class NewForDemo {
    public static void main(String[] args) {
        String[] array = {"one","two","three","four","five"};
        for(int i=0;i<array.length;i++){
            String str = array[i];
            System.out.println(str);
        }
        //新循环会被编译器改为传统的for循环遍历数组
        for(String str : array){
            System.out.println(str);
        }
/*
JDK5之后推出的另一特性：泛型
泛型也称为参数化类型，允许我们在使用一个类时指定该类中某个属性的类型，
方法参数或返回值的类型，使得我们使用这个类更加方便。
泛型在集合中广泛使用 ，用来指定集合中的元素类型。当我们不指定泛型的实际类型时，则使用默认的原型Object.

 */
//Collection<E>集合定义时指定了一个泛型，这里使用时指定E为String
        Collection<String> c = new ArrayList<>();
        //add(E e) add方法的参数就是集合使用的泛型
        c.add("一");//指定泛型后，编译器会检查实参是否符合泛型要求
        c.add("二");
        c.add("三");
        c.add("四");
        c.add("五");
//C.add(123);//类型不匹配时，编译不通过
        //遍历时可以直接用泛型指定的类型接受元素，无需再手动造型
        for(String str : c){//编译器会补充造型

            System.out.println(str);
        }

        //新循环遍历集合就是迭代器，编译器会改成迭代器遍历，如下
        //迭代器也可以指定泛型，只要与其遍历的集合指定的泛型一致即可
       Iterator<String> it = c.iterator();
        while(it.hasNext()){
            String o = it.next();
            System.out.println(o);
        }

    }
}
